/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package untils;

import java.io.*;
import java.util.ArrayList;

/**
 *
 * @author Kanet
 */
public class PhanLop {

    ArrayList<Nhom> kNhom;
    ArrayList<DoiTuong> tapHuanLuyen;
    int k;

    public int getK() {
        return k;
    }

    public void setK(int k) {
        this.k = k;
    }

    public PhanLop() {
        tapHuanLuyen = new ArrayList<>();
    }

    public boolean DocTapTin(String ten) throws FileNotFoundException, IOException {
        try (FileReader fr = new FileReader(ten); BufferedReader br = new BufferedReader(fr)) {
            String str = br.readLine();
            DoiTuong d = new DoiTuong();
            int f1 = d.DocDuLieu(str);
            if (f1 == -1) {
                return false;
            }
            this.tapHuanLuyen.add(d);
            str = br.readLine();
            while (str != null) {
                d = new DoiTuong();
                int f2 = d.DocDuLieu(str);
                if (f2 != -1 && f2 == f1) {
                    tapHuanLuyen.add(d);
                } else {
                    return false;
                }
                str = br.readLine();
            }
        }
        return true;
    }

    /*
     * Gán giá trị trung tâm đầu cho các nhóm.
     *
     */
    void GanTrungTamDau(ArrayList<Nhom> x) {

        for (int i = 0; i < this.k; i++) {
            DoiTuong trungTam = new DoiTuong("Trung tam " + i, this.tapHuanLuyen.get(i).giaTri);
            Nhom nhom = new Nhom(trungTam);
            x.add(nhom);
        }
    }

    void TimNhomChoDoiTuong(ArrayList<Nhom> x) {
        for (int i = 0; i < x.size(); i++) {
            x.get(i).nhom.clear();
        }
        for (int i = 0; i < this.tapHuanLuyen.size(); i++) {
            int idMin = 0;//Chi so nhom nho nhat
            double min = x.get(0).trungTam.KhoangCach(this.tapHuanLuyen.get(i));;//Gia tri khoang cach nho nhat so voi trung tam
            for (int j = 1; j < x.size(); j++) {

                double khoangCach = x.get(j).trungTam.KhoangCach(this.tapHuanLuyen.get(i));
                if (min > khoangCach) {
                    min = khoangCach;
                    idMin = j;
                }
            }
            x.get(idMin).nhom.add(this.tapHuanLuyen.get(i));
        }

    }

    void TinhLaiTrungTam(ArrayList<Nhom> x) {
        for (int i = 0; i < x.size(); i++) {
            x.get(i).TinhTrungTam();
        }
    }

    boolean SoSanh(ArrayList<Nhom> x, ArrayList<Nhom> y) {

        for (int i = 0; i < x.size(); i++) {
            if (x.get(i).SoSanh(y.get(i)) == false) {
                return false;
            }
        }
        return true;
    }

    public void GhiTapTin(File fn) throws IOException {
        FileWriter fw = new FileWriter(fn);
        BufferedWriter bw = new BufferedWriter(fw);
        int size = this.k;
        String str = String.format("%d", size);
        bw.write(str);
        for (int i = 0; i < this.kNhom.size(); i++) {
            bw.newLine();
            bw.write(i + "," + this.kNhom.get(i).nhom.size());
            this.kNhom.get(i).GhiTapTin(bw);
        }
        bw.close();
        fw.close();
    }

    void GanNhom(ArrayList<Nhom> x, ArrayList<Nhom> y) {
        x.clear();
        for (int i = 0; i < y.size(); i++) {
            Nhom nhom = new Nhom(y.get(i));
            x.add(nhom);
        }
    }

    public void TienHanhPhanLop(int k) {

        ArrayList<Nhom> f1 = new ArrayList<>(k);
        ArrayList<Nhom> f2 = new ArrayList<>(k);
        GanTrungTamDau(f1);
        do {
            GanNhom(f2, f1);
            TimNhomChoDoiTuong(f1);
            this.TinhLaiTrungTam(f1);
        } while (SoSanh(f2, f1) == false);
        this.kNhom = f1;
    }

    public String TinhTyLePhanNhom() {
        String s = "";

        String str = "Số mẫu : " + this.tapHuanLuyen.size() + "\n";
        s += str;
        str = "Số phân lớp : " + this.kNhom.size() + "\n";
        s += str;
        for (int i = 0; i < this.kNhom.size(); i++) {
            double tyLe = (1.0 * this.kNhom.get(i).nhom.size() / this.tapHuanLuyen.size()) * 100;
            str = String.format("Phân lớp thứ %d có : %d mẫu. Chiếm tỷ lệ : %.3f", i + 1, this.kNhom.get(i).nhom.size(), tyLe);
            str = str + "%\n";
            s += str;
        }
        return s;
    }
}
